home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-08-28 | 55.6 KB | 1,886 lines | [TEXT/MPS ] |
- /*
- File: DfltAcs.cpp
-
- Contains: Implementation of Mac specific default accessors and handlers.
-
- Owned by: Jon Pugh
-
- Copyright: © 1995-96 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <3> 6/20/96 JP 1300215: Check for null iterators
- <2> 6/4/96 EL 1335851: Release string from GetEditor.
- <57> 25/09/95 NP 1979071: Check results of operator new.
- <56> 9/12/95 JP 1280292 & 1283803: Add Part to Send
- <55> 9/11/95 JP 1269048 & 1283405: Use ODGetComments
- <54> 9/11/95 NP 1272294: Messaging code cleanup.
- <53> 8/25/95 JP 1262410: Comments part to frame fallout
- <52> 8/23/95 NP 1276287: Move constant kODAppShell.
- <51> 8/22/95 eeh 1230007: refbal-inspired cleanup
- <50> 8/16/95 eeh 1276765: mostly formatting
- <49> 8/1/95 eeh 1265319: refcount cleanup
- <48> 7/27/95 DM #1270320: mem leaks: use Temp Objs in
- GetPartFromNULL
- <47> 7/27/95 eeh 1243351: handle pIndex property
- <46> 7/21/95 eeh 1262143: call ODDisposeAppleEvent
- <45> 7/18/95 eeh 1262143: memory leaks; 1267932: SOM call on
- disposed object
- <44> 7/5/95 NP 1265196: Wrap CreateEmbeddedFramesIterator
- call with exception handling.
- <43> 7/5/95 NP 1265125: Initialize local variable.
- <42> 7/3/95 eeh 1264701: remove WARN; shouldn't be there
- anyway
- <41> 6/30/95 JP Refcounting foo
- <40> 6/29/95 DM 1242642 BB: refcounting: release parent
- frame in HandleGetDataInternal()
- <39> 6/28/95 eeh 1262143: dispose AEDescs
- <38> 6/20/95 NP 1260389: Fix DrawPart's count proc
- <37> 6/19/95 eeh 1246443: add PartFrameFromStandardPartToken
- etc.
- <36> 6/13/95 JP Use GetDefaultRootFrameToSwapTo in
- GetPartFromNULL
- <35> 6/7/95 eeh 1251403: various refcount changes
- <34> 5/26/95 TJ Removed contextInfo, and refrences to it.
- <33> 5/26/95 RR #1251403: Multithreading naming support
- <32> 5/25/95 jpa Fixed usage of ODDebug. [1253321]
- <31> 5/22/95 eeh 1250831: getdata on part returns objspec
- <30> 5/21/95 NP 1248898: GetUserToken, ODDescToAEDesc, etc.
- recipe change.
- <29> 5/18/95 eeh 1250061: make CountEmbeddedFrames
- non-static
- <28> 5/17/95 RR #1250135/1250137/1250143 Getters increment
- refcount
- <27> 5/12/95 NP 1237955: Just added a comment here,
- actually.
- <26> 5/10/95 JP 1242258: ODSetStationery uses frame instead
- of part
- <25> 5/4/95 JP 1238246, 1223529: Change name & icon of
- file if root part
- <24> 5/4/95 eeh 1246024: initialize ODFrame* in
- HandleSetData
- <23> 5/3/95 NP 1211084: Remove 5$
- <22> 4/29/95 TÇ 1244815 BB: Default Accessors return mod
- date when asked for create date
- <21> 4/28/95 eeh (for eeh) 1243352: implemented GetData for
- pContainer
- <20> 4/27/95 TÇ 1223529 BB: ODSetPOName and ODSetIconFamily
- should tweak file in root part case (Did
- name piece)
- <19> 4/25/95 NP 1186795, 1237220, 1240571: Fixed whose
- clauses by allowing swapping in count proc.
- <18> 4/25/95 JP 1192027, 1238519: Added properties and
- fixed icon & category
- <17> 4/14/95 TÇ #1235279 BB: InfoUtil & StdTypIO functions
- should take Environment* and SU* when
- possible
- <16> 4/14/95 NP 1239651: Include SEPriv.h. Private
- constants were moved around.
- <15> 4/7/95 eeh 1236842: added TrySwapToRootPart
- <14> 4/7/95 eeh 1233878: fixed memory leak
- <13> 3/24/95 eeh 1230185: check for null results and errors
- <12> 3/21/95 JP 1192027: Include ODRgstry & change some
- constant names
- <11> 3/20/95 NP 1225985: Change API of CreateSwapToken.
- <10> 3/15/95 eeh 1227456: swap when root part should be
- equivalent to the document
- <9> 3/13/95 NP 1223764: CreateSwapToken should take an
- ODFrame* parameter. Add frame param to
- DEFAULT_ACCESSOR_PARAMS.
- <8> 3/2/95 eeh 1214783: finish work on lists
- <7> 2/22/95 eeh 1214783: work on lists; 1222901:
- StandardPartToken
- <6> 2/21/95 eeh 1214783: work on lists and on getting by ID
- and name
- <5> 2/13/95 eeh 1214783: more work on Get/SetData handlers
- <4> 2/3/95 eeh 1217393: use new ODDesc etc; 1214783:
- implement Get/SetData handlers for
- part/frame info
- <3> 1/27/95 NP 1213948: Fix object accessors and event
- handlers.
- <2> 1/25/95 eeh 1214783: more implementation
- <1> 1/18/95 eeh first checked in
-
- To Do:
- In Progress:
-
- */
-
-
- #ifndef _DFLTACS_
- #include <DfltAcs.h>
- #endif
-
- #ifndef _INFOUTIL_
- #include <InfoUtil.h>
- #endif
-
- #ifndef _ODDESUTL_
- #include <ODDesUtl.h>
- #endif
-
- #ifndef _EDITRSET_
- #include "EditrSet.h"
- #endif
-
- #ifndef SOM_ODAppleEvent_xh
- #include "ODAplEvt.xh"
- #endif
-
- #ifndef SOM_ODAddressDesc_xh
- #include "ODAdrDes.xh"
- #endif
-
- #ifndef SOM_ODOSLToken_xh
- #include "ODOSLTkn.xh"
- #endif
-
- #ifndef SOM_ODPart_xh
- #include <Part.xh>
- #endif
-
- #ifndef SOM_ODPartWrapper_xh
- #include <PartWrap.xh>
- #endif
-
- #ifndef __AEPACKOBJECT__
- #include <AEPackObject.h>
- #endif
-
- #ifndef _BNDNSUTL_
- #include <BndNSUtl.h>
- #endif
-
- #ifndef SOM_ODEmbeddedFramesIterator_xh
- #include <EmbFrItr.xh>
- #endif
-
- #ifndef _SIHELPER_
- #include <SIHelper.h>
- #endif
-
- #ifndef _SEUTILS_
- #include <SEUtils.h>
- #endif
-
- #ifndef _SEPRIV_
- #include "SEPriv.h"
- #endif
-
- #ifndef _BARRAY_
- #include "BArray.h"
- #endif
-
- #ifndef _TEMPOBJ_
- #include "TempObj.h"
- #endif
-
- #ifndef SOM_DefaultAccessorSI_xh
- #include <MssgSI.xh>
- #endif
-
- #ifndef SOM_ODNameResolver_xh
- #include <NamRslvr.xh>
- #endif
-
- #ifndef SOM_ODMessageInterface_xh
- #include <MssgIntf.xh>
- #endif
-
- #ifndef SOM_ODWindowState_xh
- #include <WinStat.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdDefs_defined
- #include <StdDefs.xh>
- #endif
-
- #ifndef __AEOBJECTS__
- #include <AEObjects.h>
- #endif
-
- #ifndef __AEREGISTRY__
- #include <AERegistry.h>
- #endif
-
- #ifndef __OSA__
- #include <OSA.h>
- #endif
-
- #ifndef SOM_Module_OpenDoc_ODRegistry_defined
- #include "ODRgstry.xh"
- #endif
-
- #ifndef __ICONS__
- #include <Icons.h>
- #endif
-
- #pragma segment DefaultAccessors
-
- //==============================================================================
- // typedefs
- //==============================================================================
-
- typedef ODError (*InternalHandler)( Environment *ev,
- ODPart* thePart,
- ODAppleEvent* message,
- ODAppleEvent* reply,
- ODSession* session,
- AEDesc* directParam,
- ODFrame* frame);
-
- //==============================================================================
- // Function prototypes
- //==============================================================================
-
- static void GetDirectParam(ODSession* session, ODAppleEvent* message,
- AEDesc* evtDp);
-
- // WE SHOULD AT LEAST HAVE THIS IN A PRIVATE SHARED HEADER.
- extern ODFrame* FrameFromContext(OSLContext* context); // <eeh> ask Nick
- static DescType ViewTypetoViewEnum( Environment *ev, ODSession* session,
- ODTypeToken viewType );
- static ODTypeToken GetViewTypeFromEnum( Environment *ev, ODSession* session,
- DescType viewEnum );
- static ODIText* ITextFromIntlDesc( AEDesc* desc );
- static ODError GetEditorFromString(Environment* ev, ODEditor* editor, AEDesc* desc, ODPart* part,
- ODNameSpaceManager* nsm );
- static ODIconFamily IfamToIconSuite(AERecord* ifam);
- static ODError IconSuiteToIfam( Handle iconSuite, AEDesc* result );
- static OSErr CreateObjSpecForFrame( Environment *ev, ODFrame* frame,
- AEDesc* result );
- static void AddODOSLTokenToList( ODOSLToken* newToken, ODUShort index,
- AEDesc* list );
- static ODOSLToken* DescToODOSLToken( Environment* ev, ODNameResolver* resolver,
- AEDesc* frameDesc, ODOSLToken* tokenToCopy );
- //static ODError CreateListInValue( Environment* ev, ODNameResolver* resolver,
- // ODOSLToken* value, AEDesc* list );
- extern void NewODToken(ODNameResolver* me, ODOSLToken* openDocToken,
- ODPart* part, OSLToken* newToken);
- static ODError HandleEventsForList( Environment *ev,
- ODPart* thePart,
- ODAppleEvent* message,
- ODRecord* reply,
- ODSession* session,
- AERecord* realToken,
- InternalHandler handler );
- static ODError HandleGetDataInternal( Environment *ev, ODPart* thePart,
- ODAppleEvent* message, ODAppleEvent* reply, ODSession* session,
- AEDesc* directParam, ODFrame* frame );
- static ODError HandleSetDataInternal( Environment *ev, ODPart* thePart,
- ODAppleEvent* message, ODAppleEvent* reply, ODSession* session,
- AEDesc* directParam, ODFrame* frame );
- static void PutFrameInValue( Environment* ev, ODNameResolver* resolver,
- ODOSLToken* value, ODFrame* frame );
- static ODBoolean ITextEqual( ODIText* name1, ODIText* name2 );
- static ODFrame* AcquireFrameWithName( Environment* ev, ODFrame* startFrame,
- ODIText* name );
- static ODBoolean PartIsContained( Environment* ev, ODFrame* testee,
- ODFrame* container );
- static OSErr IndexForFrame( Environment *ev, ODFrame* frame, ODULong* result );
- static ODError SwapToRootPart( Environment *ev, ODSession* session,
- ODOSLToken* value);
- static ODPersistentObjectID GetIDForFrame( Environment* ev, ODFrame* frame );
- // static void CopyNonDPParams( ODAppleEvent* message, ODAppleEvent* newMessage );
-
- void ODDuplicateEvent( ODAppleEvent* scrDesc, ODAppleEvent** destDesc );
- void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, AEDesc* desc );
- void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, ODDesc* desc );
- void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
- AEDesc* desc );
- void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
- ODDesc** desc );
- void ODPutAttributeDesc( ODAppleEvent* message, AEKeyword key, ODDesc* desc );
- void ODGetAttributePtr( ODAppleEvent *appleEvent, AEKeyword theAEKeyword,
- DescType desiredType, DescType *typeCode, void *dataPtr,
- Size maximumSize, Size *actualSize);
-
- #if ODDebug
- void PukeIfFrameNULL( ODFrame* frame );
- #else
- #define PukeIfFrameNULL(frame)
- #endif
-
- //==============================================================================
- // Object Accessor functions
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // GetWildcardFromPart
- //------------------------------------------------------------------------------
-
- ODError GetWildcardFromPart(DEFAULT_ACCESSOR_PARAMS)
- {
- ODError result;
- TRY
- ODPart* part;
- ODFrame* frame;
- PartFrameFromStandardPartToken( container, &part, &frame );
- ASSERT_FRAME_MATCHES_PART( ev, frame, part );
- session->GetNameResolver(ev)->CreateSwapToken(ev, value, part, frame );
- result = noErr;
- CATCH_ALL
- result = errAENoSuchObject;
- ENDTRY
- return result;
- }
-
- //------------------------------------------------------------------------------
- // TrySwapToRootPart
- //------------------------------------------------------------------------------
-
- ODError TrySwapToRootPart(DEFAULT_ACCESSOR_PARAMS)
- {
- WASSERT( !scriptlessPart );
- return SwapToRootPart( ev, session, value );
- }
-
- //------------------------------------------------------------------------------
- // GetPropFromNULL
- //------------------------------------------------------------------------------
-
- ODError GetPropFromNULL(DEFAULT_ACCESSOR_PARAMS)
- {
- ODError result = noErr ;
- ODNameResolver* resolver = session->GetNameResolver(ev);
-
- TRY
- if ( (!resolver->IsODToken( ev, value )) || (form != formPropertyID) )
- THROW( errAENoSuchObject );
-
- if ( scriptlessPart == kODAppShell )
- return SwapToRootPart( ev, session, value );
-
- AEDesc realSelData;
- THROW_IF_ERROR( ODDescToAEDesc(selectionData, &realSelData ));
- TempAEDesc tmpDesc(&realSelData);
-
- switch ( FIRSTBYTESFROMHANDLE(realSelData.dataHandle, DescType) )
- {
- case pName:
- case pComment:
- case pAuthor:
- case pKind:
- case pEditorName:
- case pBundled:
- case pStationery:
- case pShowLinks:
- case pASCreationDate:
- case pASModificationDate:
- case pSize:
- case pUniqueID:
- case pIcon:
- case pViewType:
- case pContainer:
- case pCategory:
- case pClass:
- case pDefaultType:
- case pBestType:
- case pIndex:
- break;
- default:
- result = errAENoSuchObject;
- }
-
- if ( !result )
- {
- ODDesc* userTokenAsODDesc = resolver->GetUserToken(ev, value);
- THROW_IF_ERROR( AEDescToODDesc( &realSelData, userTokenAsODDesc ));
- userTokenAsODDesc->SetDescType(ev, cProperty);
- }
-
- CATCH_ALL
- result = ErrorCode();
- ENDTRY
-
- // AEDisposeDesc( &realSelData );
- return result;
- }
-
- //------------------------------------------------------------------------------
- // GetWildcardFromList
- //------------------------------------------------------------------------------
-
- ODError GetWildcardFromList(DEFAULT_ACCESSOR_PARAMS)
- {
- ODNameResolver* resolver = session->GetNameResolver(ev);
- ODError error = noErr;
-
- AEDesc newList;
- THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse, &newList ) );
- TempAEDesc tmpList( &newList );
- // THROW_IF_ERROR( CreateListInValue( ev, resolver, value,
- // &newList ) );
-
- ODSLong count;
- THROW_IF_ERROR( AECountItems( container, &count ) );
- for ( ODUShort index = 1; index <= count; ++index )
- {
- AEDesc oneContainer;
- DescType containerDescType;
-
- THROW_IF_ERROR( AEGetNthDesc( container, index, typeWildCard,
- &containerDescType, &oneContainer ) );
- TempAEDesc tmpDesc( &oneContainer );
-
- ODOSLToken* containerWrapper = new ODOSLToken();
- THROW_IF_NULL(containerWrapper);
- TempODObject tmpObj(containerWrapper);
- containerWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc( &oneContainer, containerWrapper ) );
-
- if ( !resolver->IsODToken( ev, containerWrapper ) )
- {
- error = errAENoSuchObject;
- break;
- }
-
- ODOSLToken* newValue = value->DuplicateODOSLToken(ev);
- TempODObject tmpObj2(newValue);
-
- resolver->CallObjectAccessor(ev, scriptlessPart, desiredClass,
- containerWrapper, containerClass, form, selectionData,
- newValue );
-
- AddODOSLTokenToList( newValue, index, &newList );
-
- // ODDeleteObject(newValue);
- // ODDeleteObject(containerWrapper);
-
- // (void)AEDisposeDesc( &oneContainer );
- }
-
- ODDesc* userODToken = resolver->GetUserToken(ev, value);
- AEDescToODDesc(&newList, userODToken);
- // (void)AEDisposeDesc( &newList );
-
- return error;
- } // GetWildcardFromList()
-
- //------------------------------------------------------------------------------
- // GetPartFromNULL
- //------------------------------------------------------------------------------
-
- ODError GetPartFromNULL(DEFAULT_ACCESSOR_PARAMS)
- {
- ODUnused(desiredClass);
- ODUnused(container);
- ODUnused(containerClass);
-
- ODNameResolver* resolver = session->GetNameResolver(ev);
- ODUShort i;
- ODError error = noErr;
-
- if( !resolver->IsODToken( ev, value ) )
- return errAENoSuchObject;
-
- AEDesc coercedSelData = NULL_DESCRIPTOR_DEFINITION;
-
- TRY
-
- ODFrame* containingFrame;
- ODPart* ignorePart;
- resolver->GetContextFromToken(ev, value, &ignorePart, &containingFrame);
-
- // PRINT("containingFrame = %ld\n", containingFrame);
- AEDesc realSelData;
- THROW_IF_ERROR( ODDescToAEDesc(selectionData, &realSelData ));
- TempAEDesc tmpSelData(&realSelData);
-
- switch (form)
- {
- case formName:
- {
- TempODFrame resultFrame = kODNULL;
- THROW_IF_ERROR( AECoerceDesc( &realSelData, typeIntlText,
- &coercedSelData ) );
- TempODIText name = ITextFromIntlDesc( &coercedSelData );
- AEDisposeDesc( &coercedSelData );
-
- if ( !containingFrame )
- {
- containingFrame = GetDefaultRootFrameToSwapTo(ev, session);
- // ODWindow* odWindow = session->GetWindowState(ev)->AcquireFrontRootWindow(ev);
- // containingFrame = odWindow->GetRootFrame(ev);
- // ODReleaseObject(ev, odWindow);
- TempODIText rootName = ODGetPartName(ev, containingFrame,
- kODNULL);
- if ( ITextEqual( rootName, name ) )
- resultFrame = containingFrame ;
- }
- if ( !resultFrame )
- resultFrame = AcquireFrameWithName( ev, containingFrame, name );
- PutFrameInValue( ev, resolver, value, resultFrame );
- // ODReleaseObject(ev, resultFrame);
- break;
- }
-
- case formUniqueID:
- {
- THROW_IF_ERROR( AECoerceDesc( &realSelData, typeLongInteger,
- &coercedSelData ) );
- ODPersistentObjectID objectID = FIRSTBYTESFROMHANDLE(
- coercedSelData.dataHandle, ODPersistentObjectID );
- AEDisposeDesc( &coercedSelData );
-
- ODStorageUnit* su = (containingFrame ? containingFrame :
- GetDefaultRootFrameToSwapTo(ev, session))->
- GetStorageUnit(ev);
- WASSERT(su);
- ODDraft* draft = su->GetDraft(ev);
- ODObjectType objectType;
- TempODFrame thisFrame = (ODFrame*)draft->AcquirePersistentObject(
- ev, objectID, &objectType);
- TempODObjectType tempObjectType(objectType); // ensure deletion
-
- if ( !thisFrame || (strcmp( kODFrameObject, objectType ) != 0)
- || (!PartIsContained( ev, thisFrame, containingFrame )) )
- THROW(errAENoSuchObject); // $$$$$ This could leak a reference?
- PutFrameInValue( ev, resolver, value, thisFrame );
- // ODReleaseObject(ev, tmpFrame);
- } break;
-
- case formAbsolutePosition:
- {
- // if the containing part is null, we substitute the root part
- // by doing a swap. Note that we do this *only* in the case of
- // formAbsolutePosition, because in the others we need to avoid
- // implicit "root part of root part" object specifiers.
-
- if ( scriptlessPart == kODAppShell )
- {
- error = SwapToRootPart( ev, session, value );
- break;
- }
-
- // Are we being asked for an indexed part
- // or for all parts?
- ODSLong theIndex;
- ODBoolean allFlag;
- ODBoolean zeroFlag;
-
- ODSLong partCount = CountEmbeddedParts(ev, scriptlessPart);
- error = DecodeOrdinal( realSelData, (long)partCount,
- (long*)&theIndex, (Boolean*)&allFlag, (Boolean*)&zeroFlag);
- THROW_IF_ERROR(error);
-
- ODEmbeddedFramesIterator* iter = kODNULL;
- if ( scriptlessPart != kODAppShell ) {
- iter = scriptlessPart->CreateEmbeddedFramesIterator(ev, kODNULL);
- if (iter == kODNULL)
- THROW(kODErrCannotEmbed);
- }
- if ( allFlag )
- {
- AEDesc listOfTokens;
- THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse,
- &listOfTokens ) );
- TempAEDesc tmpDesc( &listOfTokens );
- // error = CreateListInValue( ev, resolver, value, &listOfTokens );
- // THROW_IF_ERROR(error);
-
- // Get theEmbeddedPart number theIndex
- for (containingFrame = iter->First(ev), i=1; iter->IsNotComplete(ev);
- containingFrame = iter->Next(ev), i++)
- {
- if (containingFrame)
- {
- AEDesc frameDesc;
- TempODPart part = containingFrame->AcquirePart(ev);
- THROW_IF_ERROR( CreateStandardPartToken(containingFrame,
- part, &frameDesc ) );
-
- ODOSLToken* newValue = DescToODOSLToken(ev,
- resolver, &frameDesc, value );
- (void)AEDisposeDesc(&frameDesc);
- AddODOSLTokenToList( newValue, i, &listOfTokens );
- ODDeleteObject( newValue );
- }
- }
-
- ODDesc* userTokenODDesc = resolver->GetUserToken( ev, value );
- THROW_IF_ERROR(AEDescToODDesc(&listOfTokens, userTokenODDesc));
-
- // AEDisposeDesc(&listOfTokens);
- }
- else
- {
- // Get theEmbeddedPart number theIndex
- for (containingFrame = iter->First(ev), i=1; iter->IsNotComplete(ev);
- containingFrame = iter->Next(ev), i++)
- {
- if (i == theIndex)
- break;
- }
-
- PutFrameInValue( ev, resolver, value, containingFrame );
- }
- ODDeleteObject(iter);
- break;
- }
- default:
- THROW(errAENoSuchObject);
- break;
- }
-
-
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- // (void)AEDisposeDesc( &realSelData );
- return error;
- }
-
- //==============================================================================
- // Event Handler functions
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // HandleGetData
- //------------------------------------------------------------------------------
-
- ODError HandleGetData( Environment *ev,
- ODPart* thePart,
- ODAppleEvent* message,
- ODAppleEvent* reply,
- ODSession* session)
- {
- ODError error = noErr;
- ODNameResolver* resolver = session->GetNameResolver(ev);
-
- OSLToken evtDp;
- GetDirectParam( session, message, &evtDp );
- TempAEDesc tmpDesc(&evtDp);
-
- ODOSLToken* tmpWrapper = new ODOSLToken();
- THROW_IF_NULL(tmpWrapper);
- TempODObject tmpObj(tmpWrapper);
- tmpWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc(&evtDp, tmpWrapper ) );
-
- ODPart* ignorePart;
- ODFrame* frame;
- resolver->GetContextFromToken(ev, tmpWrapper, &ignorePart, &frame);
-
- ODDesc* myToken;
- myToken = resolver->GetUserToken(ev, tmpWrapper);
- AEDesc realToken;
- THROW_IF_ERROR( ODDescToAEDesc(myToken, &realToken) );
-
- error = HandleGetDataInternal( ev, thePart, message, reply,
- session, &realToken, frame );
-
- AEDisposeDesc(&realToken);
- // AEDisposeDesc(&evtDp);
-
- // ODDeleteObject(tmpWrapper);
- return error;
- }
-
- //------------------------------------------------------------------------------
- // PukeIfFrameNULL
- //------------------------------------------------------------------------------
-
- #if ODDebug
- void PukeIfFrameNULL( ODFrame* frame )
- {
- if ( !frame )
- {
- WARN( "frame is null; throwing errAEEventNotHandled." );
- THROW( errAEEventNotHandled );
- }
- }
- #endif
-
- ODError HandleGetDataInternal( Environment *ev,
- ODPart* thePart,
- ODAppleEvent* message,
- ODAppleEvent* reply,
- ODSession* session,
- AEDesc* directParam,
- ODFrame* frame)
- {
- ODError err = noErr;
-
- if ( directParam->descriptorType == typeAEList )
- {
- err = HandleEventsForList( ev, thePart, message, reply,
- session, directParam, HandleGetDataInternal );
- }
- else
- {
- if ( !thePart )
- return errAEEventNotHandled;
-
- AEDesc result = NULL_DESCRIPTOR_DEFINITION;
-
- // find out what type was requested
- // e.g. get foo as alias
- DescType desiredType, theType;
- long theSize;
- AppleEvent theMessage;
- THROW_IF_ERROR( ODDescToAEDesc(message, &theMessage) );
- err = AEGetParamPtr( &theMessage, keyAERequestedType, typeType,
- &theType, &desiredType, sizeof(desiredType), &theSize );
- ODDisposeAppleEvent(&theMessage);
- if ( err != noErr )
- desiredType = typeWildCard;
-
- switch( directParam->descriptorType )
- {
- case cPart:
- err = CreateObjSpecForFrame( ev,
- FrameFromStandardPartToken(directParam), &result );
- break;
-
- case cProperty:
- {
- ODBoolean boolResult;
- ODIText* itext = kODNULL;
-
- ODStorageUnit* partSU = ODGetSUFromPstObj(ev, thePart);
-
- DescType property = FIRSTBYTESFROMHANDLE( directParam->dataHandle,
- DescType );
-
- switch( property )
- {
- // text properties
- case pName:
- case pComment:
- case pAuthor:
- case pKind:
- case pEditorName:
- case pCategory:
- {
- ODBoolean okToDispose = kODTrue;
- if ( property == pName )
- itext = ODGetPartName(ev, frame, kODNULL );
- else if ( property == pComment )
- {
- itext = ODGetComments(ev, frame, kODNULL );
- if ( !itext )
- {
- // script and language code don't matter here; stripped below
- itext = CreateITextCString( 0, 0, "" );
- okToDispose = kODTrue;
- }
- }
- else if ( property == pCategory )
- itext = ODGetCategory(ev, thePart, session->GetNameSpaceManager(ev) );
- else if ( property == pAuthor )
- itext = ODGetModifiedBy(ev, partSU, kODNULL );
- else if ( property == pKind )
- {
- ODType theType = ODGetKind(ev, thePart );
- okToDispose = !GetUserKindFromKind(
- session->GetNameSpaceManager(ev), theType, &itext );
- }
- else if ( property == pEditorName )
- {
- TempODEditor editor = ((ODPartWrapper*)thePart)->GetEditor(ev);
- okToDispose = !GetUserEditorFromEditor(
- session->GetNameSpaceManager(ev), editor, &itext );
- }
-
- if ( itext )
- {
- err = AECreateDesc( typeChar, GetITextPtr( itext ),
- GetITextStringLength( itext ), &result );
- if ( okToDispose )
- DisposeIText(itext);
- }
- else
- err = errAEEventNotHandled;
- break;
- }
-
- // type properties
- case pClass:
- case pDefaultType:
- case pBestType:
- {
- DescType theType = cObjectSpecifier;
- if (property == pClass)
- theType = cPart;
- err = AECreateDesc(typeType, &theType, sizeof(theType), &result);
- break;
- }
-
- // boolean properties
- case pBundled:
- case pStationery:
- case pShowLinks:
- {
- if ( property == pBundled )
- {
- PukeIfFrameNULL( frame );
- ASSERT_FRAME_MATCHES_PART( ev, frame, thePart );
- boolResult = frame->IsFrozen(ev);
- }
- else if ( property == pStationery )
- boolResult = ODGetIsStationery(ev, frame);
- else // if ( property == pShowLinks )
- {
- PukeIfFrameNULL( frame );
- TempODWindow window = frame->AcquireWindow(ev);
- boolResult = window->ShouldShowLinks(ev);
- // ODReleaseObject( ev, window );
- }
-
- err = AECreateDesc(typeBoolean, &boolResult, sizeof(boolResult),
- &result );
- break;
- }
-
- // date properties
- case pASCreationDate:
- case pASModificationDate:
- {
- long theDate[2];
-
- theDate[0] = 0;
- if ( property == pASCreationDate )
- theDate[1] = ODGetCreationDate(ev, partSU);
- else // if ( property == pASModificationDate )
- theDate[1] = ODGetModificationDate(ev, partSU);
- err = AECreateDesc(typeLongDateTime, &theDate, sizeof(theDate), &result);
- break;
- }
-
- case pSize:
- {
- ODULong longResult = ODGetPOSize(ev, thePart );
- err = AECreateDesc(typeLongInteger, &longResult,
- sizeof(longResult), &result );
- break;
- }
-
- case pUniqueID:
- {
- PukeIfFrameNULL( frame );
- ODPersistentObjectID id = GetIDForFrame( ev, frame );
- err = AECreateDesc(typeLongInteger, &id,
- sizeof(id), &result );
- break;
- }
-
- case pIndex:
- PukeIfFrameNULL( frame );
- ODULong index;
- err = IndexForFrame( ev, frame, &index );
- if ( err == noErr )
- err = AECreateDesc( typeLongInteger, &index,
- sizeof(index), &result );
- break;
-
- case pIcon:
- {
- ODIconFamily iconFamily = ODGetIconFamily(ev, frame );
- err = IconSuiteToIfam( iconFamily, &result );
- break;
- }
-
- case pViewType:
- {
- PukeIfFrameNULL( frame );
- DescType type = ViewTypetoViewEnum( ev, session,
- frame->GetViewType(ev) ) ;
- err = AECreateDesc(typeEnumeration, &type,
- sizeof(type), &result );
- break;
- }
-
- case pContainer:
- {
- PukeIfFrameNULL( frame );
- { TempODFrame parentFrame = frame->AcquireContainingFrame(ev); // DMc refcount - make temp
- // DMc - I carefully checked that CreateObjSpecForFrame() does not consume this ref.
- err = parentFrame ?
- CreateObjSpecForFrame(ev, parentFrame, &result)
- : errAENoSuchObject;
- }
- break;
- }
- default:
- err = errAEEventNotHandled;
- }
- break; // case cProperty:
- }
- default:
- err = errAEEventNotHandled;
- }
-
- if ( !err )
- {
- if (desiredType != typeWildCard && desiredType != result.descriptorType)
- {
- AEDesc newDesc;
- err = AECoerceDesc(&result, desiredType, &newDesc);
- if (err != noErr)
- {
- // we can't coerce to the desiredType, so we provide a decent
- // error message and throw the error
- AppleEvent replyAsAEDesc;
- THROW_IF_ERROR( ODDescToAEDesc(reply, &replyAsAEDesc) );
- THROW_IF_ERROR( AEPutParamPtr(&replyAsAEDesc, kOSAErrorExpectedType, typeType,
- &desiredType, sizeof(desiredType)) );
- THROW_IF_ERROR( AEDescToODDesc(&replyAsAEDesc, reply) );
- ODDisposeAppleEvent(&replyAsAEDesc);
- THROW(err);
- }
-
- }
- }
-
- if ( !err )
- {
- ODPutParamDesc( reply, keyDirectObject, &result );
- AEDisposeDesc( &result );
- }
-
- }
- return err;
- } // HandleGetDataInternal
-
- //------------------------------------------------------------------------------
- // HandleEventsForList
- //------------------------------------------------------------------------------
-
- static ODError HandleEventsForList( Environment *ev,
- ODPart* thePart,
- ODAppleEvent* message,
- ODRecord* reply,
- ODSession* session,
- AERecord* realToken,
- InternalHandler handler )
- {
- ODError err = noErr;
- AERecord fakeReply;
- AERecord listOTokens;
-
- TRY
- if ( reply )
- {
- THROW_IF_ERROR( AECreateList( kODNULL, 0, kODTrue, &fakeReply ) );
- THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse, &listOTokens ));
- }
-
- ODSLong count;
- THROW_IF_ERROR( AECountItems( realToken, &count ) );
-
- for ( ODUShort index = 1; index <= count ; ++index )
- {
- AEDesc oneToken;
- DescType tokenDescType;
- THROW_IF_ERROR( AEGetNthDesc( realToken, index, typeWildCard,
- &tokenDescType, &oneToken ) );
- TempAEDesc tmpDesc( &oneToken );
-
- ODMessageInterface* msgIntf = session->GetMessageInterface(ev);
-
- AEEventClass eventClass = (AEEventClass)GetSLongAttrOD(
- message, keyEventClassAttr);
- AEEventID eventID = (AEEventID)GetSLongAttrOD(
- message, keyEventIDAttr);
-
- ODAddressDesc* addressDesc;
- msgIntf->CreatePartAddrDesc( ev, &addressDesc, thePart );// <eeh> not the right part <jp> why? is it now?
- TempODObject tmpObj(addressDesc);
-
- ODAppleEvent* newMessage;
- ODDuplicateEvent( message, &newMessage );
- TempODObject tmpODAEVT(newMessage);
- ODPutAttributeDesc( newMessage, keyAddressAttr, addressDesc );
-
- ODPutParamDesc( newMessage, keyDirectObject, &oneToken );
-
- ODAppleEvent* odreply = new ODAppleEvent();
- THROW_IF_NULL(odreply);
- TempODObject tmpObj2(odreply);
- odreply->InitODAppleEvent(ev);
-
- msgIntf->Send( ev, kODNULL, thePart, newMessage, odreply,
- kAEWaitReply | kAECanInteract | kAEDontRecord,
- kAENormalPriority,
- kAEDefaultTimeout );
-
- if ( reply )
- {
- AEDesc oneReplyToken;
- ODGetParamDesc( odreply, keyDirectObject, typeWildCard,
- &oneReplyToken );
- THROW_IF_ERROR(AEPutDesc( &listOTokens, index, &oneReplyToken));
- AEDisposeDesc( &oneReplyToken );
- }
- // ODDeleteObject( odreply );
- // ODDeleteObject( addressDesc );
- // ODDeleteObject( newMessage );
- // AEDisposeDesc( &oneToken );
- }
-
- CATCH_ALL
- err = ErrorCode();
- ENDTRY
- if ( reply )
- {
- if ( !err )
- ODPutParamDesc( (ODAppleEvent*)reply, keyDirectObject,
- &listOTokens );
- (void)AEDisposeDesc( &listOTokens );
- (void)AEDisposeDesc( &fakeReply );
- }
-
- return err;
- }
-
- //------------------------------------------------------------------------------
- // HandleSetData
- //------------------------------------------------------------------------------
-
- ODError HandleSetData( Environment *ev,
- ODPart* thePart,
- ODAppleEvent* message,
- ODAppleEvent* reply,
- ODSession* session)
- {
- ODError error = noErr;
- ODNameResolver* resolver = session->GetNameResolver(ev);
-
- AEDesc evtDp;
- GetDirectParam( session, message, &evtDp );
-
- ODOSLToken* tmpWrapper = new ODOSLToken();
- THROW_IF_NULL(tmpWrapper);
- TempODObject tmpObj(tmpWrapper);
- tmpWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc(&evtDp, tmpWrapper ) );
- (void)AEDisposeDesc( &evtDp );
-
- if( resolver->IsODToken(ev, tmpWrapper) )
- {
- ODDesc* myToken = resolver->GetUserToken(ev, tmpWrapper);
- AEDesc realToken;
- THROW_IF_ERROR( ODDescToAEDesc(myToken, &realToken ) );
- TempAEDesc tmpDesc(&realToken);
-
- ODPart* ignorePart;
- ODFrame* frame;
- resolver->GetContextFromToken(ev, tmpWrapper, &ignorePart, &frame);
-
- error = HandleSetDataInternal( ev, thePart, message, reply,
- session, &realToken, frame );
-
- // (void)AEDisposeDesc( &realToken );
- }
- else
- error = errAENoSuchObject;
-
- // ODDeleteObject(tmpWrapper);
-
- return error;
- }
-
-
- //------------------------------------------------------------------------------
- // HandleSetDataInternal
- //------------------------------------------------------------------------------
-
- ODError HandleSetDataInternal( Environment *ev, ODPart* thePart,
- ODAppleEvent* message, ODAppleEvent* /*reply*/, ODSession* session,
- AEDesc* directParam, ODFrame* frame )
- {
- ODError error = noErr;
-
- if ( directParam->descriptorType == typeAEList )
- {
- // SetData for lists provided for testing only! Will be removed before ship
- #if ODDebug
- error = HandleEventsForList( ev, thePart, message, kODNULL, // null for reply
- session, directParam, HandleSetDataInternal );
- #else
- // we don't do destructive things on lists. There's no way to ensure
- // that all will succeed before beginning, and managing fewer than
- // all of them is not acceptable.
- return errAEEventNotHandled;
- #endif
- }
- else
- {
- if ( directParam->descriptorType != cProperty )
- return errAENoSuchObject;
-
- // ODFrame* frame = session->GetNameResolver(ev)->AcquireContainingFrame(ev);
-
- DescType property = FIRSTBYTESFROMHANDLE( directParam->dataHandle,
- DescType );
-
- AEDesc dataDesc;
- ODGetParamDesc( message, keyAEData, typeWildCard, &dataDesc );
- if ( !error )
- {
- AEDesc coercedDataDesc;
- coercedDataDesc.dataHandle = kODNULL;
- switch( property )
- {
- // read only properties: this is an error
- case pAuthor:
- case pSize:
- case pASCreationDate:
- case pASModificationDate:
- case pCategory:
- case pKind:
- case pUniqueID:
- case pContainer:
- case pIndex:
- // <eeh> is there an error for setting r/o properties?
- error = errAEEventNotHandled;
- break;
-
- case pName:
- case pComment:
- error = AECoerceDesc( &dataDesc, typeIntlText, &coercedDataDesc );
- if ( !error )
- {
- ODIText* name = ITextFromIntlDesc(&coercedDataDesc);
- if ( property == pName )
- {
- if (!ODSetPartName(ev, frame, name, kAENo))
- error = errAEEventNotHandled;
- }
- else // if ( property == pComment )
- ODSetComments(ev, frame, name );
-
- DisposeIText(name);
- }
- break;
-
- case pBundled:
- case pStationery:
- case pShowLinks:
- error = AECoerceDesc( &dataDesc, typeBoolean, &coercedDataDesc );
- if ( !error )
- {
- ODBoolean bool = FIRSTBYTESFROMHANDLE(
- coercedDataDesc.dataHandle, ODBoolean );
- if ( property == pBundled )
- {
- WASSERT( frame );
- ASSERT_FRAME_MATCHES_PART( ev, frame, thePart );
- frame->SetFrozen( ev, bool );
- }
- else if ( property == pStationery )
- ODSetIsStationery(ev, frame, bool );
- else if ( property == pShowLinks )
- {
- PukeIfFrameNULL( frame );
- SetAllWindowShowLinks(ev, session->GetWindowState(ev), bool);
- // TempODWindow window = frame->AcquireWindow(ev);
- // window->SetShouldShowLinks(ev, bool );
- // ODReleaseObject( ev, window );
- }
- }
- break;
-
- case pIcon:
- error = AECoerceDesc( &dataDesc, typeAERecord, &coercedDataDesc );
- if ( !error )
- {
- ODIconFamily iconFamily = IfamToIconSuite(&coercedDataDesc);
- ODSetIconFamily(ev, frame, iconFamily );
- (void) DisposeIconSuite( iconFamily, kODTrue );
- }
- break;
-
- case pViewType:
- error = AECoerceDesc( &dataDesc, typeEnumeration,
- &coercedDataDesc );
- if ( !error )
- {
- DescType viewEnum = FIRSTBYTESFROMHANDLE(
- coercedDataDesc.dataHandle, ODTypeToken );
- ODTypeToken viewType = GetViewTypeFromEnum( ev, session,
- viewEnum );
- PukeIfFrameNULL( frame );
- frame->SetViewType( ev, viewType );
- }
- break;
-
- case pEditorName:
- error = AECoerceDesc(&dataDesc, typeIntlText, &coercedDataDesc);
- if ( !error )
- {
- ODEditor editor;
- error = GetEditorFromString(ev, &editor, &coercedDataDesc,
- thePart, session->GetNameSpaceManager(ev) );
- TempODEditor tempEditor = ((ODPartWrapper*)thePart)->GetEditor(ev);
- if ( (!error) &&
- // don't try to set the same editor again....
- strcmp(editor,tempEditor))
- {
- // <eeh> note that other code calling UseEditor
- // mucks with the storage unit, perhaps to make
- // the change stick? Check this out.
- ((ODPartWrapper*)thePart)->UseEditor( ev, editor );
- }
- }
- break;
-
- default:
- error = errAEEventNotHandled;
- }
- AEDisposeDesc( &coercedDataDesc );
- AEDisposeDesc( &dataDesc );
- }
- }
-
- return error;
- } // HandleSetData()
-
- /*******************************************************************************
- //
- // Utility functions
- //
- *******************************************************************************/
-
- //------------------------------------------------------------------------------
- // PutOneIcon
- //------------------------------------------------------------------------------
-
- static void PutOneIcon( Handle iconSuite, AERecord* ifam, DescType type )
- {
- Handle iconData;
- OSErr err = GetIconFromSuite( &iconData, iconSuite, type);
- if ( err == noErr )
- {
- AEDesc oneIcon;
- oneIcon.descriptorType = type;
- oneIcon.dataHandle = iconData;
- err = AEPutKeyDesc( ifam, type, &oneIcon );
- }
- }
-
- //------------------------------------------------------------------------------
- // IconSuiteToIfam
- //------------------------------------------------------------------------------
-
- static ODError IconSuiteToIfam( Handle iconSuite, AEDesc* result )
- {
- if ( !iconSuite )
- return errAEEventFailed; // need a better error?
- AERecord record;
- ODError err = AECreateList( kODNULL, 0, kODTrue, &record );
- if ( err ) return err ;
-
- PutOneIcon( iconSuite, &record, large1BitMask ); // 'ICN#',
- PutOneIcon( iconSuite, &record, large4BitData ); // 'icl4',
- PutOneIcon( iconSuite, &record, large8BitData ); // 'icl8',
- PutOneIcon( iconSuite, &record, small1BitMask ); // 'ics#',
- PutOneIcon( iconSuite, &record, small4BitData ); // 'ics4',
- PutOneIcon( iconSuite, &record, small8BitData ); // 'ics8',
- PutOneIcon( iconSuite, &record, mini1BitMask ); // 'icm#',
- PutOneIcon( iconSuite, &record, mini4BitData ); // 'icm4',
- PutOneIcon( iconSuite, &record, mini8BitData ); // 'icm8'
-
- err = AECoerceDesc( &record, 'ifam', result );
- AEDisposeDesc( &record );
- return err;
- }
-
- //------------------------------------------------------------------------------
- // GetOneIcon
- //------------------------------------------------------------------------------
-
- static void GetOneIcon( Handle iconSuite, AERecord* ifam, DescType type )
- {
- AEDesc oneIcon;
- ODError err = AEGetKeyDesc( ifam, type, type, &oneIcon );
- if ( !err )
- {
- if ( AddIconToSuite( oneIcon.dataHandle, iconSuite, type) != noErr )
- // no point in holding onto the handle
- AEDisposeDesc( &oneIcon );
- }
- }
-
- //------------------------------------------------------------------------------
- // IfamToIconSuite
- //------------------------------------------------------------------------------
-
- static ODIconFamily IfamToIconSuite(AERecord* ifam)
- {
- Handle iconSuite;
- OSErr err = NewIconSuite( &iconSuite );
- if ( err ) return kODNULL;
-
- GetOneIcon( iconSuite, ifam, large1BitMask ); // 'ICN#',
- GetOneIcon( iconSuite, ifam, large4BitData ); // 'icl4',
- GetOneIcon( iconSuite, ifam, large8BitData ); // 'icl8',
- GetOneIcon( iconSuite, ifam, small1BitMask ); // 'ics#',
- GetOneIcon( iconSuite, ifam, small4BitData ); // 'ics4',
- GetOneIcon( iconSuite, ifam, small8BitData ); // 'ics8',
- GetOneIcon( iconSuite, ifam, mini1BitMask ); // 'icm#',
- GetOneIcon( iconSuite, ifam, mini4BitData ); // 'icm4',
- GetOneIcon( iconSuite, ifam, mini8BitData ); // 'icm8'
-
- return iconSuite;
- }
-
- //------------------------------------------------------------------------------
- // GetEditorFromString
- //------------------------------------------------------------------------------
-
- static ODError GetEditorFromString(Environment* ev, ODEditor* editor, AEDesc* desc, ODPart* part,
- ODNameSpaceManager* nsm )
- {
- ODError error = errAEEventNotHandled;
- TempODIText newEditor = ITextFromIntlDesc( desc );
- if ( !newEditor ) return errAEEventNotHandled;
-
- EditorSet* editorSet = new EditorSet();
- editorSet->InitEditorSet();
- ODBoolean someFound = GetAllEditorsForKind( nsm, ODGetKind(ev, part ),
- editorSet );
-
- if ( someFound )
- {
- EditorSetIterator* editorIter = editorSet->CreateIterator();
- for (ODEditor candidate = editorIter->First();
- editorIter->IsNotComplete();
- candidate = editorIter->Next())
- {
- ODName* name;
- if ( GetUserEditorFromEditor( nsm, candidate, &name ) )
- {
- if ( (GetITextStringLength(name) == GetITextStringLength(newEditor))
- && (GetITextLangCode(name) == GetITextLangCode(newEditor))
- && (GetITextScriptCode(name) == GetITextScriptCode(newEditor))
- && strncmp(GetITextPtr(name),
- GetITextPtr(newEditor), GetITextStringLength(name)) == 0 )
- {
- *editor = candidate;
- error = noErr;
- break;
- }
- }
- }
- delete editorIter;
- }
- ODDeleteObject( editorSet );
- // DisposeIText(newEditor);
- return error;
- }
-
- //------------------------------------------------------------------------------
- // ITextFromIntlDesc
- //------------------------------------------------------------------------------
-
- static ODIText* ITextFromIntlDesc( AEDesc* desc )
- {
- WASSERT( desc->descriptorType == typeIntlText );
-
- ODSLong len = GetHandleSize( desc->dataHandle );
- ODLockHandle( desc->dataHandle );
- IntlText* ASItext = (IntlText*)*desc->dataHandle;
- // save as we're about to overwrite with stringlength byte
- ScriptCode scriptCode = ASItext->theScriptCode;
- LangCode langCode = ASItext->theLangCode;
- char* str = ((char*)&ASItext->theText) - 1 ;
- len -= sizeof(ASItext->theScriptCode)
- + sizeof(ASItext->theScriptCode);
- str[0] = len;
- ODIText* name = CreateIText( scriptCode, langCode,
- (StringPtr)str );
- ODUnlockHandle( desc->dataHandle );
- return name;
- }
-
- //------------------------------------------------------------------------------
- // ViewTypetoViewEnum
- //------------------------------------------------------------------------------
-
- static DescType ViewTypetoViewEnum( Environment *ev, ODSession* session,
- ODTypeToken viewType )
- {
- if ( viewType == session->Tokenize(ev, kODViewAsSmallIcon) )
- return kAEODSmallIcon;
- else if ( viewType == session->Tokenize(ev, kODViewAsLargeIcon) )
- return kAEODLargeIcon;
- else if ( viewType == session->Tokenize(ev, kODViewAsFrame) )
- return kAEODFrame;
- else if ( viewType == session->Tokenize(ev, kODViewAsThumbnail) )
- return kAEODThumbnail;
- else
- {
- WARN( "ViewTypetoViewEnum found unknown viewType" );
- return typeNull;
- }
- }
-
- //------------------------------------------------------------------------------
- // GetViewTypeFromEnum
- //------------------------------------------------------------------------------
-
- static ODTypeToken GetViewTypeFromEnum( Environment *ev, ODSession* session,
- DescType viewEnum )
- {
- switch( viewEnum )
- {
- case kAEODSmallIcon:
- return session->Tokenize(ev, kODViewAsSmallIcon);
- case kAEODLargeIcon:
- return session->Tokenize(ev, kODViewAsLargeIcon);
- case kAEODFrame:
- return session->Tokenize(ev, kODViewAsFrame);
- case kAEODThumbnail:
- return session->Tokenize(ev, kODViewAsThumbnail);
- default:
- WARN( "GetViewTypeFromEnum: unknown view type enum" );
- return -1;
- }
- }
-
- //------------------------------------------------------------------------------
- // GetDirectParam
- //
- // WE NEED TO CONSOLIDATE THIS WITH GetDirectParam IN RlShlEv.cpp!
- //------------------------------------------------------------------------------
-
- static void GetDirectParam(ODSession* session, ODAppleEvent* message,
- AEDesc* evtDp)
- {
- Environment* ev = somGetGlobalEnvironment();
- AppleEvent localAEVT;
- THROW_IF_ERROR( ODDescToAEDesc( message, &localAEVT ) );
-
- AEDesc localDP;
- THROW_IF_ERROR( AEGetParamDesc( &localAEVT, keyDirectObject,
- typeWildCard, &localDP ) );
- ODOSLToken* oddesc = new ODOSLToken();
- THROW_IF_NULL(oddesc);
- oddesc->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc( &localDP, oddesc ) );
-
- ODNameResolver* resolver = session->GetNameResolver(ev);
- ODBoolean isToken = resolver->IsODToken(ev, oddesc);
- ODDeleteObject(oddesc);
- if ( isToken )
- {
- *evtDp = localDP;
- }
- else
- {
- (void)AEDisposeDesc( &localDP );
- WARN("GetDirectParam. Found a non-token. About to throw.");
- THROW( errAEEventNotHandled );
- }
-
- ODDisposeAppleEvent(&localAEVT);
- } // GetDirectParam()
-
- //------------------------------------------------------------------------------
- // DescToODOSLToken
- //------------------------------------------------------------------------------
-
- static ODOSLToken* DescToODOSLToken( Environment* ev, ODNameResolver* resolver,
- AEDesc* frameDesc, ODOSLToken* tokenToCopy )
- {
- ODOSLToken* newToken = tokenToCopy->DuplicateODOSLToken(ev);
- ODDesc* userODToken = resolver->GetUserToken( ev, newToken );
- AEDescToODDesc(frameDesc, userODToken);
-
- return newToken;
- }
-
- //------------------------------------------------------------------------------
- // AddODOSLTokenToList
- //
- // Add newToken into list that's in value.
- //------------------------------------------------------------------------------
-
- static void AddODOSLTokenToList( ODOSLToken* newToken, ODUShort index,
- AEDesc* list )
- {
- AEDesc singleTokenAsAEDesc;
- THROW_IF_ERROR( ODDescToAEDesc( newToken, &singleTokenAsAEDesc ) );
-
- WASSERT( list->descriptorType == typeAEList );
-
- THROW_IF_ERROR( AEPutDesc( list, index, &singleTokenAsAEDesc) );
- (void)AEDisposeDesc( &singleTokenAsAEDesc );
- }
-
-
- //------------------------------------------------------------------------------
- // PutFrameInValue
- //------------------------------------------------------------------------------
-
- static void PutFrameInValue( Environment* ev, ODNameResolver* resolver,
- ODOSLToken* value, ODFrame* frame )
- {
- AEDesc myToken;
-
- if ( !frame )
- THROW(errAENoSuchObject);
- TempODPart part = frame->AcquirePart(ev);
- CreateStandardPartToken( frame, part, &myToken );
- ODDesc* userODToken = resolver->GetUserToken(ev, value);
- THROW_IF_ERROR( AEDescToODDesc( &myToken, userODToken ));
- AEDisposeDesc(&myToken);
- }
-
- //------------------------------------------------------------------------------
- // ITextEqual
- //------------------------------------------------------------------------------
-
- static ODBoolean ITextEqual( ODIText* name1, ODIText* name2 )
- {
- return ( (GetITextLangCode(name1) == GetITextLangCode(name2))
- && (GetITextScriptCode(name1) == GetITextScriptCode(name2))
- && (GetITextStringLength(name1) == GetITextStringLength(name2))
- && (strcmp( GetITextString(name1, (char*)kODNULL),
- GetITextString(name2, (char*)kODNULL))==0) ) ;
- }
-
- //------------------------------------------------------------------------------
- // AcquireFrameWithName
- //------------------------------------------------------------------------------
- static ODFrame* AcquireFrameWithName( Environment* ev, ODFrame* startFrame,
- ODIText* name )
- {
- // beginning with this part, or with root part if this part is null,
- // do a recursive search until we find a part whose name is the same
- // as that given by name. It's important to always begin the search
- // with this part, as we shouldn't find a part with the target name if
- // it isn't inside our container.
-
- ODBoolean foundNonEmbeddingFrame = kODFalse;
- ODEmbeddedFramesIterator* iter;
-
- ODVolatile(foundNonEmbeddingFrame);
-
- WASSERT( startFrame );
-
- TempODPart savePart = startFrame->AcquirePart(ev);
- TRY
- iter = savePart->CreateEmbeddedFramesIterator(ev, kODNULL);
- if (iter == kODNULL)
- foundNonEmbeddingFrame = kODTrue;
- CATCH_ALL
- foundNonEmbeddingFrame = kODTrue;
- ENDTRY
-
- ODFrame* result = kODNULL;
-
- if (!foundNonEmbeddingFrame)
- {
- ODFrame* frame;
- for ( frame = iter->First(ev); iter->IsNotComplete(ev);
- frame = iter->Next(ev) )
- {
- TempODIText canName = ODGetPartName(ev, frame, kODNULL );
- if ( ITextEqual( canName, name ) )
- {
- frame->Acquire(ev);
- result = frame;
- break;
- }
- else if ( (result = AcquireFrameWithName( ev, frame, name )) != kODNULL )
- break;
- }
- ODDeleteObject(iter);
- }
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // CreateObjSpecForFrame
- //------------------------------------------------------------------------------
-
- static OSErr CreateObjSpecForFrame( Environment *ev, ODFrame* frame,
- AEDesc* result )
- {
- ODPersistentObjectID id = GetIDForFrame( ev, frame );
- AEDesc nullDesc = NULL_DESCRIPTOR_DEFINITION;
- AEDesc dataDesc;
- THROW_IF_ERROR( AECreateDesc( typeLongInteger, &id, sizeof(id),
- &dataDesc ) );
- return CreateObjSpecifier( cPart, &nullDesc, pUniqueID,
- &dataDesc, true, result );
- }
-
- //------------------------------------------------------------------------------
- // GetIDForFrame
- //------------------------------------------------------------------------------
-
- static ODPersistentObjectID GetIDForFrame( Environment* ev, ODFrame* frame )
- {
- ODStorageUnit* su = frame->GetStorageUnit(ev);
- WASSERT(su);
- ODDraft* draft = su->GetDraft(ev);
- WASSERT(draft);
- return draft->GetPersistentObjectID( ev,
- (ODPersistentObject*)frame, kODFrameObject);
- }
-
- //------------------------------------------------------------------------------
- // CopyNonDPParams
- // Move from one AppleEvent to another all parameters but the direct parameter.
- // <eeh> should modify to move attributes as well, probably by changing the
- // type of the AppleEvent from 'aevt' to 'meta' temporarily. This function
- // could then also be used in ODMessageInterface::DispatchToEventHandlerAux
- // where it copies data back into the reply it must return.
- //------------------------------------------------------------------------------
-
- #ifdef TO_BE_DELETED
- static void CopyNonDPParams( ODAppleEvent* message, ODAppleEvent* newMessage )
- {
- AppleEvent sourceAEVT;
- AppleEvent destAEVT;
- THROW_IF_ERROR( ODDescToAEDesc( message, &sourceAEVT ) );
- THROW_IF_ERROR( ODDescToAEDesc( newMessage, &destAEVT ) );
-
- long numParams;
- THROW_IF_ERROR( AECountItems( &sourceAEVT, &numParams ) );
- for ( long index = 1; index <= numParams; ++index )
- {
- AEDesc oneParam;
- DescType keyword;
- THROW_IF_ERROR( AEGetNthDesc( &sourceAEVT, index, typeWildCard,
- &keyword, &oneParam ) );
- if ( keyword != keyDirectObject )
- THROW_IF_ERROR( AEPutParamDesc( &destAEVT, keyword, &oneParam ) );
- AEDisposeDesc( &oneParam );
- }
- THROW_IF_ERROR( AEDescToODDesc( &destAEVT, newMessage ) );
- ODDisposeAppleEvent( &sourceAEVT );
- ODDisposeAppleEvent( &destAEVT );
- }
- #endif /* TO_BE_DELETED */
-
- //------------------------------------------------------------------------------
- // PartIsContained
- //------------------------------------------------------------------------------
-
- ODBoolean PartIsContained( Environment* ev, ODFrame* testee,
- ODFrame* container )
- {
- ODBoolean result ;
- if ( !testee )
- result = kODFalse;
- else if ( !container )
- result = kODTrue; // root frame contains all
-
- // before the first AcquireContainingFrame call don't test for equality,
- // as a frame can't contain itself.
- else
- {
- while ( !result &&
- ((testee = testee->AcquireContainingFrame(ev)) != kODNULL) )
- {
- result = ODObjectsAreEqual( ev, testee, container );
- ODFrame* saveCopy = testee;
- ODReleaseObject( ev, saveCopy );
- }
- }
- return result;
- }
-
- //------------------------------------------------------------------------------
- // IndexForFrame
- //------------------------------------------------------------------------------
-
- static OSErr IndexForFrame( Environment *ev, ODFrame* frame, ODULong* result )
- {
- TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
- ODULong tempResult = 0;
- if ( parentFrame != kODNULL )
- {
- TempODPart part = parentFrame->AcquirePart(ev);
- ODEmbeddedFramesIterator* iter =
- part->CreateEmbeddedFramesIterator( ev, kODNULL );
- if (iter == kODNULL)
- THROW(kODErrCannotEmbed);
- ODFrame* testFrame;
- for ( testFrame = iter->First(ev), tempResult = 1;
- !ODObjectsAreEqual(ev, frame, testFrame)
- && iter->IsNotComplete(ev);
- ++tempResult, testFrame = iter->Next(ev) )
- {
- }
- ODDeleteObject(iter);
- }
- else
- {
- return errAENoSuchObject;
- }
- *result = tempResult;
- return noErr;
- }
-
- //------------------------------------------------------------------------------
- // SwapToRootPart
- //------------------------------------------------------------------------------
-
- static ODError SwapToRootPart( Environment *ev, ODSession* session,
- ODOSLToken* value)
- {
- ODFrame* frame = GetDefaultRootFrameToSwapTo(ev, session);
- if ( !frame )
- return errAENoSuchObject;
- else
- {
- // when will this part be released???
- TempODPart savePart = frame->AcquirePart(ev);
- session->GetNameResolver(ev)->
- CreateSwapToken( ev, value, savePart, frame );
- // ODReleaseObject( ev, savePart );
- }
- return noErr;
- }
-
- //------------------------------------------------------------------------------
- // ODDuplicateEvent
- //------------------------------------------------------------------------------
-
- void ODDuplicateEvent( ODAppleEvent* scrDesc,
- ODAppleEvent** destDesc )
- {
- Environment* ev = somGetGlobalEnvironment();
- AppleEvent newAevt;
- OSErr err = ODDescToAEDesc( scrDesc, &newAevt );
- if ( err == noErr )
- {
- ODAppleEvent* tmp = new ODAppleEvent();
- THROW_IF_NULL(tmp);
- tmp->InitODAppleEvent(ev);
- err = AEDescToODDesc( &newAevt, tmp );
- ODDisposeAppleEvent(&newAevt);
- *destDesc = tmp;
- }
- THROW_IF_ERROR(err);
- }
-
- //------------------------------------------------------------------------------
- // ODPutParamDesc
- //------------------------------------------------------------------------------
-
- void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, AEDesc* desc )
- {
- AppleEvent local;
- OSErr err = ODDescToAEDesc( odaevt, &local );
- if ( err == noErr )
- {
- err = AEPutParamDesc( &local, keyword, desc );
- if ( err == noErr )
- err = AEDescToODDesc( &local, odaevt );
- ODDisposeAppleEvent(&local);
- }
- THROW_IF_ERROR(err);
- }
-
- //------------------------------------------------------------------------------
- // ODPutParamDesc
- //------------------------------------------------------------------------------
-
- void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, ODDesc* desc )
- {
- AEDesc localDesc;
- THROW_IF_ERROR( ODDescToAEDesc( desc, &localDesc ) );
- TempAEDesc tmpDesc(&localDesc);
- ODPutParamDesc( odaevt, keyword, &localDesc );
- }
-
- //------------------------------------------------------------------------------
- // ODGetParamDesc
- //------------------------------------------------------------------------------
-
- void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
- AEDesc* desc )
- {
- AppleEvent event;
- OSErr err = ODDescToAEDesc( odaevt, &event );
- if ( err == noErr )
- {
- err = AEGetParamDesc( &event, keyword, typeSought, desc );
- ODDisposeAppleEvent(&event);
- }
- THROW_IF_ERROR(err);
- }
-
- //------------------------------------------------------------------------------
- // ODGetParamDesc
- //------------------------------------------------------------------------------
-
- void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword,
- DescType typeSought, ODDesc** desc )
- {
- Environment* ev = somGetGlobalEnvironment();
- AEDesc resultAsAEDesc;
-
- ODDesc* result = new ODDesc();
- THROW_IF_NULL(result);
- result->InitODDesc( ev );
-
- ODGetParamDesc( odaevt, keyword, typeSought, &resultAsAEDesc );
- OSErr error = AEDescToODDesc( &resultAsAEDesc, result);
- THROW_IF_ERROR (error);
- AEDisposeDesc(&resultAsAEDesc);
- *desc = result;
- }
-
- //------------------------------------------------------------------------------
- // ODPutAttributeDesc
- //------------------------------------------------------------------------------
-
- void ODPutAttributeDesc( ODAppleEvent* message, AEKeyword key, ODDesc* desc )
- {
- AppleEvent messageAsAEDesc;
- THROW_IF_ERROR( ODDescToAEDesc( message, &messageAsAEDesc ) );
- AEDesc attrDescAsAEDesc;
- THROW_IF_ERROR( ODDescToAEDesc( desc, &attrDescAsAEDesc ) );
- THROW_IF_ERROR( AEPutAttributeDesc( &messageAsAEDesc, key,
- &attrDescAsAEDesc) );
- AEDisposeDesc(&attrDescAsAEDesc);
- THROW_IF_ERROR( AEDescToODDesc(&messageAsAEDesc, message ));
- ODDisposeAppleEvent(&messageAsAEDesc);
- }
-
- //------------------------------------------------------------------------------
- // ODGetAttributePtr
- //------------------------------------------------------------------------------
-
- void ODGetAttributePtr( ODAppleEvent *appleEvent, AEKeyword theAEKeyword,
- DescType desiredType, DescType *typeCode, void *dataPtr,
- Size maximumSize, Size *actualSize)
- {
- AppleEvent event;
- OSErr err = ODDescToAEDesc( appleEvent, &event );
- if ( err == noErr )
- {
- err = AEGetAttributePtr( &event, theAEKeyword, desiredType,
- typeCode, dataPtr, maximumSize, actualSize );
- (void)ODDisposeAppleEvent( &event );
- }
- THROW_IF_ERROR( err );
- }
-
- #if ODDebug
- void ASSERT_FRAME_MATCHES_PART( Environment *ev, ODFrame* frame, ODPart* part )
- {
- #if 0
- if ( frame )
- {
- TempODPart savePart = frame->AcquirePart(ev);
- ODBoolean partMatchesFrame = ODObjectsAreEqual(ev, savePart, part);
- // ODBoolean partMatchesFrame = savePart == part;
- // ODReleaseObject( ev, savePart );
- WASSERT( partMatchesFrame );
- }
- #endif
- }
- #endif
-
-